/**
 * 生成器函数
 * 生成器是不可构造的
 * 生成器开始 ~ 生成器结束
 * @param {*} i
 */
function* generator(i) {
  yield i; // 直到遇到第一个 yield 表达式，该表达式指定了迭代器要返回的值 或者  用 yield* 委托给另一个生成器函数
  return 2; // return 生成器结束
  yield i + 10;
}

/**
 * 每次调用生成器函数时，它都会返回一个新的 Generator 对象
 */
const gen = generator(10);

/**
 * 1当迭代器的 next() 方法被调用时，生成器函数的主体会被执行
 * 2next() 方法返回一个对象
 * 3如果 next() 方法带有参数，那么它会恢复生成器函数的执行，并用参数替换暂停执行的 yield 表达式。
 */
console.log(gen.next().value); // Expected output: 10
console.log(gen.next()); // Expected output: 20
console.log(gen.next()); // undefined  调用了才知道生成器结束
console.log(gen.next()); // undefined
